package junior.Simulation模拟;

import java.util.Random;

public class Pi {
    public static void main(String[] args) {
        Pi pi = new Pi();
        MonteCarlo();
    }

//    蒙特卡洛法计算圆周率
/**
实验次数n，正方形边长m
 面积之比=1/4圆内投点与n之比（结果公式为化简结果）
 */
    static public void MonteCarlo(){
        Random ran = new Random();
        int exp,n,m;  //试验次数，总投点次数，圆内投点次数，参数i，j
        double b,pi,x,y; //随机数范围(正方形边长)，pi值，投点坐标x，y
        pi=0;
        exp=100000;
        n=100000;
        b=1000;
        for (int i = 0; i < exp; i++) {
            m=0;
            for (int j = 0; j < n; j++) {
                x=ran.nextDouble()*b;
                y=ran.nextDouble()*b;
                if (x*x + y*y < b*b && 0<x && 0 <y)
                    m = m + 1;    //随机投点在圆形内部，则m增1
            }
            pi += 4.0*m/n;  //公式化简结果
        }
        System.out.println("蒙特卡洛计算的圆周率pi值为："+pi/exp);
        System.out.printf("蒙特卡洛计算的圆周率pi值为：%.3f",pi/exp);


    }
//    指定高精度计算
    public void HighPrecision(){

    }
}
